const userTable = require('../models/userTable');
const inspirecloud = require('@byteinspire/inspirecloud-api');
const ObjectId = inspirecloud.db.ObjectId;


class userService {
    /**
     * 列出所有用户
     */
    async listAll() {
        return await userTable.where().sort({createAt: -1}).find();
    }


    async getOneById(id) {
        return await userTable.where({_id: ObjectId(id)}).findOne();
    }


    /**
     * 创建一条用户
     * @param user 用于创建用户的数据，原样存进数据库
     * @return {Promise<any>} 返回实际插入数据库的数据，会增加_id，createdAt和updatedAt字段
     */
    async create(user) {
        return await userTable.save(user);
    }

    /**
     * 删除一条用户
     * @param id 用户的 _id
     * 若不存在，则抛出 404 错误
     */
    async delete(id) {
        const user = await userTable.where({_id: ObjectId(id)}).findOne();
        if (!user) {
            const error = new Error(`user:${id} not found`);
            error.status = 404;
            throw error;
        }
        user.is_delete = true;
        await userTable.save(user);
    }

    /**
     * 删除所有用户
     */
    async deleteAll() {
        await userTable.where().delete();
    }

    /**
     * 更新一条用户
     * @param newuser._id 将会用原对象 merge 此对象进行更新
     * 若不存在，则抛出 404 错误
     */
    async update(newuser) {
        const user = await userTable.where({_id: ObjectId(newuser._id)}).findOne();
        if (!user) {
            const error = new Error(`user:${newuser._id} not found`);
            error.status = 404;
            throw error;
        }
        Object.assign(user, newuser);
        user._id = ObjectId(user._id);
        await userTable.save(user);
    }
}

// 导出 Service 的实例
module.exports = new userService();
